package com.code.generate.core;

import com.code.generate.utils.FileUtils;
import freemarker.cache.FileTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.*;
import java.util.*;

/**
 * 代码生成器的核心处理类
 * 使用Freemarker完成文件生成
 * 数据模型 + 模板
 * 数据：
 * 数据模型
 * 模板的位置
 * 生成文件的路径
 *
 * @author hl
 */
public class Generator {
  //模板路径
  private String templatePath;
  //代码生成路径
  private String outPath;

  private Configuration cfg;

  private List<String> suffixAlist = Arrays.asList("BMP", "JPG", "JPEG", "PNG", "GIF", "SVG", "SCSS", "CSS", "LESS");


  public Generator(String templatePath, String outPath) throws Exception {
    this.templatePath = templatePath;
    this.outPath = outPath;
    //实例化Configuration对象
    cfg = new Configuration();
    //指定模板加载器
    FileTemplateLoader ftl = new FileTemplateLoader(new File(templatePath));
    cfg.setTemplateLoader(ftl);
  }

  /**
   * 代码生成
   * 扫描模板路径下的所有模板
   * 对每个模板进行文件生成（数据模型）
   */
  public void scanAndGenerator(Map<String, Object> dataModel) throws Exception {
    //根据模板路径找到此路径下的所有模板文件
    List<File> fileList = FileUtils.searchAllFile(new File(templatePath));
    //对每个模板进行文件生成
    for (File file : fileList) {
      String suffix = (file.toString().substring(file.toString().lastIndexOf(".") + 1)).toUpperCase();
      if (!suffixAlist.contains(suffix)) {
        executeGenertor(dataModel, file);
      } else {
        // 前端资源处理
        String templateFileName = file.getAbsolutePath().replace(this.templatePath, "");
        String outFileName = processTemplateString(templateFileName, dataModel);
        File mkdirFile = FileUtils.mkdir(outPath, outFileName);
        FileUtils.Filecopy(file.toString(), mkdirFile.toString());
      }
    }
  }

  /**
   * 对模板进行文件生成
   *
   * @param dataModel ： 数据模型
   * @param file      ： 模板文件
   *                  模板文件：c：com.xxx.system.abc.java
   */
  private void executeGenertor(Map<String, Object> dataModel, File file) throws Exception {
    //文件路径处理   (E:\模板\${path1}\${path2}\${path3}\${ClassName}.java)
    //templatePath : E:\模板\
    String templateFileName = file.getAbsolutePath().replace(this.templatePath, "");
    String outFileName = processTemplateString(templateFileName, dataModel);
    //读取文件模板
    Template template = cfg.getTemplate(templateFileName);
    //指定生成文件的字符集编码
    template.setOutputEncoding("utf-8");
    //创建文件
    File file1 = FileUtils.mkdir(outPath, outFileName);
    //模板处理（文件生成）
    FileWriter fw = new FileWriter(file1);
    template.process(dataModel, fw);
    fw.close();
  }


  public String processTemplateString(String templateString, Map dataModel) throws Exception {
    StringWriter out = new StringWriter();
    Template template = new Template("ts", new StringReader(templateString), cfg);
    template.process(dataModel, out);
    return out.toString();
  }
}
